package com.itheima.d4_print_stream;

import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.nio.charset.Charset;

/**
 * 目标：
 * 掌握打印流：PrintStream/PrintWriter的用法。
 *
 * PrintStream/PrintWriter（打印流）
 * 作用：打印流可以实现更方便、更高效的打印数据出去，能实现打印啥出去就是啥出去。
 *      (打印数据指的是写数据出去，原来写一个97出去到文件里面可能就是a，打印流打印的是97，那么到文件中也是97)
 *
 * PrintStream提供的打印数据的方案
 *          构造器
 *  public PrintStream(OutputStream/File/String)           打印流直接通向字节输出流/文件/文件路径
 *  public PrintStream(String fileName, Charset charset)    可以指定写出去的字符编码
 *  public PrintStream(OutputStream out, boolean autoFlush)     可以指定实现自动刷新
 *  public PrintStream(OutputStream out, boolean autoFlush, String encoding)    可以指定实现自动刷新，并可指定字符的编码
 *          方法
 *  public void println(Xxx xx)     打印任意类型的数据出去
 *  public void write(int/byte[]/byte[]一部分)     可以支持写字节数据出去
 *
 *
 * PrintWriter提供的打印数据的方案
 *          构造器
 *  public PrintWriter(OutputStream/Writer/File/String)        打印流直接通向字节输出流/文件/文件路径
 *  public PrintWriter(String fileName, Charset charset)       可以指定写出去的字符编码
 *  public PrintWriter(OutputStream out/Writer, boolean autoFlush)     可以指定实现自动刷新
 *  public PrintWriter(OutputStream out, boolean autoFlush, String encoding)   可以指定实现自动刷新，并可指定字符的编码
 *          方法
 *  public void println(Xxx xx)                 打印任意类型的数据出去
 *  public void write(int/String/char[]/..)     可以支持写字符数据出去
 *
 *
 *  PrintStream和PrintWriter的区别
 * 打印数据的功能上是一模一样的：都是使用方便，性能高效（核心优势）
 * PrintStream继承自字节输出流OutputStream，因此支持写字节数据的方法。
 * PrintWriter继承自字符输出流Writer，因此支持写字符数据出去。
 *
 * 总结：
 *      打印流有几种？各有什么特点？
 *      打印流一般是指：PrintStream，PrintWriter两个类。
 *      打印功能2者是一样的使用方式
 *      PrintStream继承自字节输出流OutputStream，支持写字节
 *      PrintWrite继承自字符输出流Writer，支持写字符
 *      打印流的优势是什么？
 *      两者在打印功能上都是使用方便，性能高效（核心优势）
 *
 * 想要追加，就需要先包装成文件字节输出流，然后在低级流管道进行追加
 */
public class PrintTest1 {
    public static void main(String[] args) {
        try (
                // 1、创建一个打印流管道
/*                PrintStream ps =
                        new PrintStream("Day09Io-App2/src/itheima08.txt");*/

            /*    //报错：Cannot resolve constructor 'PrintStream(FileWriter)
                  //PrintStream是继承字节输出流的，不支持包装字符输出流
                PrintStream ps =
                        new PrintStream(new FileWriter("Day09Io-App2/src/itheima08.txt",true));
*/
               /*  //这样是可以的，PrintStream是继承字节输出流的，所以支持包装FileOutputSteam
               PrintStream ps =
                        new PrintStream(new FileOutputStream("Day09Io-App2/src/itheima08.txt",true));
  */
                /*
                指定字符集编
                可以进去看源码：this.textOut = new BufferedWriter(charOut);里面包装了字符缓冲输出流，有缓冲池，所以性能高
                 */
/*                PrintStream ps =
                        new PrintStream("Day09Io-App2/src/itheima08.txt", Charset.forName("GBK"));
                */
/*                PrintWriter ps =
                        new PrintWriter("Day09Io-App2/src/itheima08.txt");*/

                //想要追加，就需要先包装成文件字节输出流，然后在低级流管道进行追加
                //PrintWrite继承自字符输出流Writer，但是可以包装继承字节输出流的FileOutputStream，真奇怪
                PrintWriter ps =
                        new PrintWriter(new FileOutputStream("Day09Io-App2/src/itheima08.txt", true));

         /*     //PrintWrite继承自字符输出流Writer，所以也可以包装继承字符输出流的FileWriter
                PrintWriter ps =
                        new PrintWriter(new FileWriter("Day09Io-App2/src/itheima08.txt", true));
*/
                ){
                ps.println(97);
                ps.println('a');
                ps.println("我爱你中国abc");
                ps.println(true);
                ps.println(99.5);

                // ps.write(97); // 'a'

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
